//============================================================================================
/**
 * @file	item.h
 * @brief	アイテムデータ処理
 * @author	Hiroyuki Nakamura
 * @date	05.09.06
 */
//============================================================================================
#ifndef ITEM_H
#define ITEM_H

#include "gflib/strbuf.h"
#include "itemtool/itemsym.h"
#include "itemtool/itemequip.h"


//============================================================================================
//	定数定義
//============================================================================================
typedef struct _ITEM_DATA	ITEMDATA;		// アイテムデータ

// 特殊アイテムID（アイコン取得などに使用）
#define	ITEM_DUMMY_ID	( 0 )				// ダミーID
#define	ITEM_RETURN_ID	( 0xffff )			// 戻る

// メールアイテムのスタートナンバー
#define MAIL_START_ITEMNUM	(ITEM_GURASUMEERU)
#define MAIL_END_ITEMNUM	(MAIL_START_ITEMNUM+ITEM_MAIL_MAX-1)

//木の実・こやしアイテムのスタートナンバー他
#define	NUTS_START_ITEMNUM	( ITEM_KURABONOMI )		// アイテム番号の最初の木の実
#define NUTS_END_ITEMNUM	( NUTS_START_ITEMNUM+ITEM_NUTS_MAX-1 )	//アイテム番号の最後の木の実
#define COMPOST_START_ITEMNUM	(ITEM_SUKUSUKUKOYASI)
#define ITEM_COMPOST_MAX		(ITEM_NEBANEBAKOYASI-ITEM_SUKUSUKUKOYASI+1)
#define ITEMNO_TO_KINOMINO(no)	((no)-NUTS_START_ITEMNUM)
#define KINOMINO_TO_ITEMNO(no)	((no)+NUTS_START_ITEMNUM)

// インデックス取得定義
enum {
	ITEM_GET_DATA = 0,		// アイテムデータ
	ITEM_GET_ICON_CGX,		// アイコンキャラ
	ITEM_GET_ICON_PAL,		// アイコンパレット
	ITEM_GET_AGB_NUM		// AGBのアイテム番号
};

// パラメータ取得定義
enum {
	ITEM_PRM_PRICE,					// 買値
	ITEM_PRM_EQUIP,					// 装備効果
	ITEM_PRM_ATTACK,				// 威力
	ITEM_PRM_EVENT,					// 重要
	ITEM_PRM_CNV,					// 便利ボタン
	ITEM_PRM_POCKET,				// 保存先（ポケット番号）
	ITEM_PRM_FIELD,					// field機能
	ITEM_PRM_BATTLE,				// battle機能
	ITEM_PRM_TUIBAMU_EFF,			// ついばむ効果
	ITEM_PRM_NAGETUKERU_EFF,		// なげつける効果
	ITEM_PRM_NAGETUKERU_ATC,		// なげつける威力
	ITEM_PRM_SIZENNOMEGUMI_ATC,		// しぜんのめぐみ威力
	ITEM_PRM_SIZENNOMEGUMI_TYPE,	// しぜんのめぐみタイプ
	ITEM_PRM_BTL_POCKET,			// 戦闘保存先（ポケット番号）
	ITEM_PRM_W_TYPE,				// ワークタイプ
	ITEM_PRM_SLEEP_RCV,				// 眠り回復
	ITEM_PRM_POISON_RCV,			// 毒回復
	ITEM_PRM_BURN_RCV,				// 火傷回復
	ITEM_PRM_ICE_RCV,				// 氷回復
	ITEM_PRM_PARALYZE_RCV,			// 麻痺回復
	ITEM_PRM_PANIC_RCV,				// 混乱回復
	ITEM_PRM_MEROMERO_RCV,			// メロメロ回復
	ITEM_PRM_ABILITY_GUARD,			// 能力ガード
	ITEM_PRM_DEATH_RCV,				// 瀕死回復
	ITEM_PRM_ALL_DEATH_RCV,			// 全員瀕死回復
	ITEM_PRM_LV_UP,					// レベルアップ
	ITEM_PRM_EVOLUTION,				// 進化
	ITEM_PRM_ATTACK_UP,				// 攻撃力アップ
	ITEM_PRM_DEFENCE_UP,			// 防御力アップ
	ITEM_PRM_SP_ATTACK_UP,			// 特攻アップ
	ITEM_PRM_SP_DEFENCE_UP,			// 特防アップ
	ITEM_PRM_AGILITY_UP,			// 素早さアップ
	ITEM_PRM_HIT_UP,				// 命中率アップ
	ITEM_PRM_CRITICAL_UP,			// クリティカル率アップ
	ITEM_PRM_PP_UP,					// PPアップ
	ITEM_PRM_PP_3UP,				// PPアップ（３段階）
	ITEM_PRM_PP_RCV,				// PP回復
	ITEM_PRM_ALL_PP_RCV,			// PP回復（全ての技）
	ITEM_PRM_HP_RCV,				// HP回復
	ITEM_PRM_HP_EXP,				// HP努力値アップ
	ITEM_PRM_POWER_EXP,				// 攻撃努力値アップ
	ITEM_PRM_DEFENCE_EXP,			// 防御努力値アップ
	ITEM_PRM_AGILITY_EXP,			// 素早さ努力値アップ
	ITEM_PRM_SP_ATTACK_EXP,			// 特攻努力値アップ
	ITEM_PRM_SP_DEFENCE_EXP,		// 特防努力値アップ
	ITEM_PRM_FRIEND1,				// なつき度１
	ITEM_PRM_FRIEND2,				// なつき度２
	ITEM_PRM_FRIEND3,				// なつき度３
	ITEM_PRM_HP_EXP_POINT,			// HP努力値の値
	ITEM_PRM_POWER_EXP_POINT,		// 攻撃努力値の値
	ITEM_PRM_DEFENCE_EXP_POINT,		// 防御努力値の値
	ITEM_PRM_AGILITY_EXP_POINT,		// 素早さ努力値の値
	ITEM_PRM_SP_ATTACK_EXP_POINT,	// 特攻努力値の値
	ITEM_PRM_SP_DEFENCE_EXP_POINT,	// 特防努力値の値
	ITEM_PRM_HP_RCV_POINT,			// HP回復値の値
	ITEM_PRM_PP_RCV_POINT,			// pp回復値の値
	ITEM_PRM_FRIEND1_POINT,			// なつき度1の値
	ITEM_PRM_FRIEND2_POINT,			// なつき度2の値
	ITEM_PRM_FRIEND3_POINT,			// なつき度3の値
};

// ワークタイプの種類
enum {
	ITEM_WKTYPE_DUMMY = 0,		// ダミー
	ITEM_WKTYPE_POKEUSE,		// ポケモンに使う
};

#define	ITEM_ICON_CGX_SIZE	( 0x20 * 4 * 4 )	// アイテムアイコンのキャラサイズ

///ボールID定義
typedef enum{
 BALLID_NULL,			// NULL
 BALLID_MASUTAABOORU,	//01 マスターボール
 BALLID_HAIPAABOORU,	//02 ハイパーボール
 BALLID_SUUPAABOORU,	//03 スーパーボール
 BALLID_MONSUTAABOORU,	//04 モンスターボール
 BALLID_SAFARIBOORU,	//05 サファリボール
 BALLID_NETTOBOORU,		//06 ネットボール
 BALLID_DAIBUBOORU,		//07 ダイブボール
 BALLID_NESUTOBOORU,		//08 ネストボール
 BALLID_RIPIITOBOORU,	//09 リピートボール
 BALLID_TAIMAABOORU,		//10 タイマーボール
 BALLID_GOOZYASUBOORU,	//11 ゴージャスボール
 BALLID_PUREMIABOORU,	//12 プレミアボール
 BALLID_DAAKUBOORU,		//13 ダークボール
 BALLID_HIIRUBOORU,		//14 ヒールボール
 BALLID_KUIKKUBOORU,		//15 クイックボール
 BALLID_PURESYASUBOORU,	//16 プレシャスボール

 BALLID_SUPIIDOBOORU,	//17 スピードボール
 BALLID_REBERUBOORU,		//18 レベルボール
 BALLID_RUAABOORU,		//19 ルアーボール
 BALLID_HEBIIBOORU,		//20 ヘビーボール
 BALLID_RABURABUBOORU,	//21 ラブラブボール
 BALLID_HURENDOBOORU,	//22 フレンドボール
 BALLID_MUUNBOORU,		//23 ムーンボール
 BALLID_KONPEBOORU,		//24 コンペボール
 BALLID_MAX = BALLID_KONPEBOORU,	//パークボールは実体のないボールなのでIDに含めません
}BALL_ID;


//============================================================================================
//	プロトタイプ宣言
//============================================================================================

//--------------------------------------------------------------------------------------------
/**
 * 指定アイテムを指定位置に挿入
 *
 * @param	item	アイテムデータ
 * @param	pos1	指定アイテム位置
 * @param	pos2	挿入位置
 *
 * @return	none
 */
//--------------------------------------------------------------------------------------------
extern void ItemPutIn( void * item, int pos1, int pos2, int pocketNo, u32 heapId );

//============================================================================================
//============================================================================================
//	データ取得
//============================================================================================
//============================================================================================

//--------------------------------------------------------------------------------------------
/**
 * データインデックス取得
 *
 * @param	item		アイテム番号
 * @param	type		取得データ
 *
 * @return	指定データ
 *
 * @li	type = ITEM_GET_DATA		: アイテムデータのアーカイブインデックス
 * @li	type = ITEM_GET_ICON_CGX	: アイコンキャラのアーカイブインデックス
 * @li	type = ITEM_GET_ICON_PAL	: アイコンパレットのアーカイブインデックス
 * @li	type = ITEM_GET_AGB_NUM		: AGBのアイテム番号
 */
//--------------------------------------------------------------------------------------------
extern u16 GetItemIndex( u16 item, u16 type );

//--------------------------------------------------------------------------------------------
/**
 * AGBのアイテムをDPのアイテムに変換
 *
 * @param	agb		AGBのアイテム番号
 *
 * @retval	"ITEM_DUMMY_ID = DPにないアイテム"
 * @retval	"ITEM_DUMMY_ID != DPのアイテム番号"
 */
//--------------------------------------------------------------------------------------------
extern u16 ITEM_AgbItemCnv( u16 agb );

//--------------------------------------------------------------------------------------------
/**
 * アイテムアイコンのセルアーカイブインデックス取得
 *
 * @param	none
 *
 * @return	セルアーカイブインデックス
 */
//--------------------------------------------------------------------------------------------
extern u16 ItemIconCellGet(void);

//--------------------------------------------------------------------------------------------
/**
 * アイテムアイコンのセルアニメアーカイブインデックス取得
 *
 * @param	none
 *
 * @return	セルアニメアーカイブインデックス
 */
//--------------------------------------------------------------------------------------------
extern u16 ItemIconCAnmGet(void);

//--------------------------------------------------------------------------------------------
/**
 * アーカイブデータロード
 *
 * @param	item		アイテム番号
 * @param	type		取得データ
 * @param	heap_id		ヒープID
 *
 * @return	指定データ
 *
 * @li	type = ITEM_GET_DATA		: アイテムデータ
 * @li	type = ITEM_GET_ICON_CGX	: アイコンのキャラデータ
 * @li	type = ITEM_GET_ICON_PAL	: アイコンのパレットデータ
 */
//--------------------------------------------------------------------------------------------
extern void * GetItemArcData( u16 item, u16 type, u32 heap_id );

//--------------------------------------------------------------------------------------------
/**
 * 名前取得
 *
 * @param	buf			格納場所
 * @param	item		アイテム番号
 * @param	heap_id		ヒープID
 *
 * @return	none
 */
//--------------------------------------------------------------------------------------------
extern void GetItemName( STRBUF* buf, u16 item, u32 heap_id );

//--------------------------------------------------------------------------------------------
/**
 * 説明取得
 *
 * @param   buf			アイテム名格納先バッファ
 * @param	item		アイテム番号
 * @param	heap_id		ヒープID
 *
 * @return	説明
 */
//--------------------------------------------------------------------------------------------
extern void ItemInfoGet( STRBUF * buf, u16 item, u16 heap_id );

//--------------------------------------------------------------------------------------------
/**
 * 装備説明取得
 *
 * @param   buf			アイテム名格納先バッファ
 * @param	item		アイテム番号
 * @param	heap_id		ヒープID
 *
 * @return	装備説明
 */
//--------------------------------------------------------------------------------------------
extern void ItemEpuipInfoGet( STRBUF * buf, u16 item, u16 heap_id );

//--------------------------------------------------------------------------------------------
/**
 * パラメータ取得（アイテム番号指定）
 *
 * @param	item	アイテム番号
 * @param	param	取得パラメータ定義
 * @param	heap_id		ヒープID
 *
 * @return	指定パラメータ
 */
//--------------------------------------------------------------------------------------------
extern s32 ItemParamGet( u16 item, u16 param, u32 heap_id );

//--------------------------------------------------------------------------------------------
/**
 * パラメータ取得（アイテムデータ指定）
 *
 * @param	item	アイテムデータ
 * @param	param	取得パラメータ定義
 *
 * @return	指定パラメータ
 */
//--------------------------------------------------------------------------------------------
extern s32 ItemBufParamGet( ITEMDATA * item, u16 param );

//--------------------------------------------------------------------------------------------
/**
 * 技マシンで覚えられる技を取得
 *
 * @param	item	アイテム番号
 *
 * @return	技番号
 */
//--------------------------------------------------------------------------------------------
extern const u16 GetWazaNoItem( u16 item );

//--------------------------------------------------------------------------------------------
/**
 * 選択された技が秘伝技かどうか
 *
 * @param	waza	技番号
 *
 * @retval	"TRUE = 秘伝技"
 * @retval	"FALSE = 秘伝技以外"
 */
//--------------------------------------------------------------------------------------------
extern u8 HidenWazaCheck( u16 waza );

//--------------------------------------------------------------------------------------------
/**
 * 技マシン番号取得
 *
 * @param	item	アイテム番号
 *
 * @return	技マシン番号
 */
//--------------------------------------------------------------------------------------------
extern u8 WazaMashineNoGet( u16 item );

//--------------------------------------------------------------------------------------------
/**
 * アイテムがメールかどうかをチェック
 *
 * @param	item	アイテム番号
 *
 * @retval	"TRUE = メール"
 * @retval	"FALSE = メール以外"
 */
//--------------------------------------------------------------------------------------------
extern u8 ItemMailCheck( u16 item );

//--------------------------------------------------------------------------------------------
/**
 * アイテム番号からメールのデザインを取得
 *
 * @param	item	アイテム番号
 *
 * @return	デザインID
 */
//--------------------------------------------------------------------------------------------
extern u8 ItemMailDesignGet( u16 item );

//--------------------------------------------------------------------------------------------
/**
 * メールのデザインからアイテム番号を取得
 *
 * @param	design		デザインID
 *
 * @return	アイテム番号
 */
//--------------------------------------------------------------------------------------------
extern u16 MailItemNumGet( u8 design );

/**
 *	@brief	アイテムナンバーからボールIDに変換する
 */
extern BALL_ID ItemNo2BallId(u16 itemno);

/*
 *	@brief	ボールIDからアイテムナンバーに変換する
 */
extern u16 BallId2ItemNo(BALL_ID ball_id);

//--------------------------------------------------------------------------------------------
/**
 * アイテムが木の実かどうかをチェック
 *
 * @param	item	アイテム番号
 *
 * @retval	"TRUE = 木の実"
 * @retval	"FALSE = 木の実以外"
 */
//--------------------------------------------------------------------------------------------
extern u8 ItemNutsCheck( u16 item );

//--------------------------------------------------------------------------------------------
/**
 * 木の実の番号を取得
 *
 * @param	item	アイテム番号
 *
 * @return	木の実番号
 */
//--------------------------------------------------------------------------------------------
extern u8 NutsNoGet( u16 item );

//--------------------------------------------------------------------------------------------
/**
 * 指定IDの木の実のアイテム番号を取得
 *
 * @param	id		木の実のID
 *
 * @return	アイテム番号
 */
//--------------------------------------------------------------------------------------------
extern u16 NutsIDItemGet( u8 id );

//--------------------------------------------------------------------------------------------
/**
 * 木の実名取得
 *
 * @param   buf			格納先
 * @param	id			木の実番号
 * @param   heap		ヒープID（テンポラリとして使用）
 *
 * @return	none
 */
//--------------------------------------------------------------------------------------------
extern void NutsNameGet( STRBUF * buf, u16 id, u32 heap );

//--------------------------------------------------------------------------------------------
/**
 * 木の実名取得（領域確保）
 *
 * @param	id			木の実番号
 * @param   heap		ヒープID（テンポラリとして使用）
 *
 * @return	取得した木の実名のバッファ
 *
 * @li	解放は各自で
 */
//--------------------------------------------------------------------------------------------
extern STRBUF * NutsNameGetAlloc( u16 id, u32 heap );

//--------------------------------------------------------------------------------------------
/**
 * アイテムが漢方薬かどうかをチェック
 *
 * @param	item	アイテム番号
 *
 * @retval	"TRUE = 漢方薬"
 * @retval	"FALSE = 漢方薬"
 */
//--------------------------------------------------------------------------------------------
extern u8 ItemKanpouyakuCheck( u16 item );

//--------------------------------------------------------------------------------------------
/**
 * アイテムテーブルをすべてメモリに展開
 *
 * @param	heapID	展開するメモリヒープID
 *
 * @retval	確保したメモリのアドレス
 */
//--------------------------------------------------------------------------------------------
extern	void	*ItemDataTableLoad(int heapID);

//--------------------------------------------------------------------------------------------
/**
 * アイテムテーブルから任意のアドレスを取得
 *
 * @param	item	アイテムテーブル
 * @param	index	とりだすインデックスナンバー
 *
 * @retval	取得したアドレス
 */
//--------------------------------------------------------------------------------------------
extern	ITEMDATA	*GetItemDataPointer(ITEMDATA *item,u16 index);

//--------------------------------------------------------------------------------------------
/**
 * アイテムをポケモンに持たせられるか
 *
 * @param	item	アイテム番号
 *
 * @retval	"TRUE = 可"
 * @retval	"FALSE = 不可"
 *
 *	基本、金銀で追加されたもの
 */
//--------------------------------------------------------------------------------------------
extern BOOL ItemPokeAddCheck( u16 item );


#endif	/* ITEM_H */